#include "Down_load_process.h"
#include "Serial_port.h"
#include "main_windw.h"
#include "ui_main_windw.h"
#include "string.h"
#include <QDebug>
#include "Timer.h"
#include <QMessageBox>

//!-----------------宏定义--------------------
#define PARAM_LENTH 24
#define this_delay_ms(n) delay_ms(n)
//!-----------------外部引用-------------------

//!-----------------外部引用-------------------

//!-----------------全局变量-------------------
uint8_t g_down_load_buf[PARAM_LENTH + 1] = {0}; // buffer

//!_________________TAB_表--------------------

//!-----------------函数声明-------------------
void Save_data_to_flash(uint8_t *save_data);
uint16_t CRC16Default(uint8_t *pszBuf, uint16_t unLength);
//!-----------------函数接口-------------------

void Main_windw::Init_param(void)
{
}

/**
 * @brief 对置字节顺序
 */
void Main_windw::swapEndianness(void *data, uint16_t size)
{
    uint8_t *bytes = (uint8_t *)data;
    uint8_t i;

    for (i = 0; i < size / 2; i++)
    {
        uint8_t temp = bytes[i];
        bytes[i] = bytes[size - 1 - i];
        bytes[size - 1 - i] = temp;
    }
}

/*!
 *   @bref
 */
void Main_windw::hardware_recv_process(void)
{
    //    uint8_t i = 0;
    //    qDebug()<<"size:"<<Serial_data_buf.size();
    //    for(i=0;i<Serial_data_buf.size();i++){
    //        g_down_load_buf[i] = static_cast<uint8_t>(Serial_data_buf[i]);
    //    }

    //    Serial_data_buf.clear(); //清空串口接收缓冲
}
/*!
 *   @bref   串口发送数据
 */
void Main_windw::send_to_host_data(uint8_t *h_buf, uint16_t h_lenth)
{

    //    serialPort->write((char *)h_buf,h_lenth);  //串口发送数据
    Q_UNUSED(h_buf);
    Q_UNUSED(h_lenth);
}

/******************************************************
*函数名称:CRC16Default
*输   入:pszBuf  要校验的数据
        unLength 校验数据的长
*输   出:校验值
*功   能:循环冗余校验-16
         （美国标准-0x8005）
*******************************************************/
uint16_t CRC16Default(uint8_t *pszBuf, uint16_t unLength)
{
    uint16_t i, j;
    uint16_t CrcReg = 0xFFFF;
    uint16_t CurVal;

    for (i = 0; i < unLength; i++)
    {
        CurVal = pszBuf[i] << 8;
        for (j = 0; j < 8; j++)
        {
            if ((short)(CrcReg ^ CurVal) < 0)
            {
                CrcReg = (CrcReg << 1) ^ 0x8005;
            }
            else
            {
                CrcReg <<= 1;
            }
            CurVal <<= 1;
        }
    }
    return CrcReg;
}
/**----------------------------------------------------
 * 生成数据校验位
 * @param   str 需要校验的数据
 * @param   len 需要校验的数据长度
 * @return  生成后的校验位
 **---------------------------------------------------*/
uint8_t data_check(uint8_t *str, uint8_t len)
{
    uint8_t d = str[0];
    for (uint8_t i = 1; i < len; i++)
    {
        d ^= str[i];
        //        qDebug()<<str[i];
    }
    return d; // 返回校验位
}

/*!
 *   @bref   清除串口接收超时状态
 */
void Main_windw::clear_serial_state(void)
{

    serial_back_state = NO_INPUT; // 接收成功标志
    send_time_out = NO_TIME_OUT;
}
/*!
 *   @bref   等待串口返回数据
 *   param   等待的超时时间
 */
uint8_t Main_windw::wait_serial_data_state(uint32_t time)
{
    // 开启等待定时器
    // 等待串口返回写入命令
    Q_UNUSED(time);
    //    qDebug()<<"定时器id"+QString("%1").arg(waite_serial_back_time);
    while ((serial_back_state == NO_INPUT) && (send_time_out == NO_TIME_OUT))
    { // 串口还没有收到，超时也没有发生，就一直等
        delay_ms(10);
    }

    if ((send_time_out == NO_TIME_OUT) && (serial_back_state == OK_INPUT))
    { // 没有超时并且返回数据
        return D_OK;
    }
    else if ((send_time_out == TIME_OUT) && (serial_back_state == NO_INPUT))
    { // 超时,并且没有数据
        ui->textBrowser_megtips->setText("串口接收数据超时,并且没有数据!");
        // qDebug()<<"超时,并且没有数据";
    }
    else if ((send_time_out == NO_TIME_OUT) && (serial_back_state == ER_INPUT))
    { // 没有超时但数据错误
        ui->textBrowser_megtips->setText("串口接收成功但数据内容发生错误!");
        // qDebug()<<"没有超时但数据错误";
    }
    else
    { // 其他异常情况
        ui->textBrowser_megtips->setText("通讯异常!");
        // qDebug()<<"其他异常情况";
    }
    return D_ERROR;
}
/*!
 *  @bref 等待命令
 */
uint8_t Main_windw::wait_order(void)
{

    hardware_recv_process();

    if (g_down_load_buf[0] == PACK_HEAD && (g_down_load_buf[1] == PACK_HEAD))
    { //

        return D_DATA;
    }
    else
    { //! 无效数据的命令
        memset(g_down_load_buf, 0, PACK_LENTH);
        this_delay_ms(5);
        return D_ERROR;
    }
    memset(g_down_load_buf, 0, PACK_LENTH);
    return D_OK;
}
